package offer2

/*
https://leetcode.cn/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/

B站 帅地玩编程
剑指offer 57_2.和为s的连续正数序列
输入一个正整数 target ，输出所有和为 target 的连续正整数序列（至少含有两个数）。
序列内的数字由小到大排列，不同序列按照首个数字从小到大排列。

示例1:
输入：target = 9
输出：[[2,3,4],[4,5]]

示例2:
输入：target = 15
输出：[[1,2,3,4,5],[4,5,6],[7,8]]
*/

func findContinuousSequence(target int) [][]int {

	var res [][]int // 声明结果二维数组
	slow := 1       // 定义快慢指针指针
	fast := 1

	sum := 1 // 窗口的和

	for slow <= target/2 { // 左边界是不能大于 target/2的，因为是递增的，如果大于，后面肯定没有符合条件的数了
		if sum < target { //只要sum<目标值
			fast++      //快指针++
			sum += fast //sum+=快指针值
		} else if sum > target { //如果已经超过了和
			sum -= slow //sum和减去慢指针
			slow++      //慢指针++
		} else { // 否则就是找到了符合条件的滑动窗口数组

			temp := make([]int, fast-slow+1) //创建临时数组
			index := 0                       //临时数组下标

			for k := slow; k <= fast; k++ { //慢指针-->快指针范围内所有元素, 复制到临时数组
				temp[index] = k
				index++
			}

			sum -= slow //总和减去慢指针
			slow++      //因为当前范围, 正好符合了target值, 所以慢指针向右移动, 那么为了凑成target, 右指针也需要右移
			fast++
			sum += fast //总和加上快指针的值

			res = append(res, temp) //将子结果装入结果数组
		}
	}

	return res
}
